let promise = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve("成功"); // 状态从 pending → fulfilled
        reject(new Error("失败")); // 无效！状态已变为 fulfilled，不会再变
    }, 1000);
});

promise
    .then(value => console.log(value)) // 输出："成功"（状态已确定）
    .catch(reason => console.log(reason)); // 不会执行

promise = new Promise((resolve, reject) => {
    reject(new Error("先失败")); // 状态从 pending → rejected
    resolve("再成功"); // 无效！状态已变为 rejected
});

promise
    .then(value => console.log(value)) // 不会执行
    .catch(reason => console.log(reason.message)); // 输出："先失败"

/**
 *
 * @type {Promise<never>}
 */
// 创建一个会失败的 Promise
const rejectedPromise = Promise.reject(new Error("参数失败"));

promise = new Promise((resolve, reject) => {
    resolve(rejectedPromise); // resolve 的参数是一个失败的 Promise
});

promise
    .then(value => console.log(value)) // 不会执行
    .catch(reason => console.log(reason.message)); // 输出："参数失败"
/**
 *
 * @type {{then(*, *): void}}
 */
const thenable = {
    then(resolve, reject) {
        reject(new Error("thenable 失败")); // 在 then 中调用 reject
    }
};

promise = new Promise((resolve, reject) => {
    resolve(thenable); // resolve 接收 thenable 对象
});

promise
    .then(value => console.log(value)) // 不会执行
    .catch(reason => console.log(reason.message)); // 输出："thenable 失败"

/**
 * resolve 方法的行为会根据参数类型不同而变化：
 * 如果参数是普通值（非 Promise/thenable）：当前 Promise 会变为 fulfilled，结果为该值。
 * 如果参数是另一个 Promise：当前 Promise 会「委托」给该参数 Promise，即：
 * 若参数是 fulfilled，当前 Promise 也变为 fulfilled，结果相同；
 * 若参数是 rejected，当前 Promise 也变为 rejected，失败原因相同。
 */

/**
 * reject 的行为非常直接：无论参数是什么类型，它只会做一件事 —— 将当前 Promise 状态变为 rejected，
 * 并将参数原样作为失败原因。它不会像 resolve 那样对 Promise/thenable 类型的参数进行「状态委托」或「异步等待」，
 * 这是两者在设计上的核心差异。
 * @type {Promise<any>}
 */
promise = new Promise((resolve, reject) => {
    reject("普通错误信息"); // 参数是字符串
});

promise.catch(reason => {
    console.log(reason); // 输出："普通错误信息"（直接使用参数）
});

const fulfilledPromise = Promise.resolve("成功结果");

promise = new Promise((resolve, reject) => {
    reject(fulfilledPromise); // 参数是一个成功的 Promise
});

promise.catch(reason => {
    console.log(reason); // 输出：Promise { '成功结果' }（直接将 Promise 作为原因，不会等待其状态）
    console.log(reason instanceof Promise); // 输出：true（原因就是这个 Promise 对象）
});